#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

#include "sans.h"
#include "garbagecollector.h"
#include "runtime.h"
#include "symboltable.h"

sdata bltn_newline() {
  printf("\n");
  return SDBOOL(0);
}

void display_string(sdata ob) {
  u len = heap_ref(ob.data.value).data.ivalue;
  u i;
  sdata c;
  for(i=0; i<len; i++){
    c = heap_ref(ob.data.value + 1 + i);
    printf("%c", (char)c.data.ivalue);
  }
}

sdata bltn_display(sdata ob) {
  switch (ob.tag) {
  case tbool:
    if(ob.data.ivalue) {
      printf("#t");
    } else {
      printf("#f");
    }
    break;
  case tchar:
    printf("%c", (char)ob.data.ivalue);
    break;
  case tstrn:
    display_string(ob);
    break;
  case tsymb:
    printf("%s", lookup(ob.data.value));
    break;
  case tnumb:
    printf("%lu",ob.data.ivalue);
    break;
  case tcons:
    printf("(");
    bltn_display(heap_ref(ob.data.value));
    printf(" . ");
    bltn_display(heap_ref(ob.data.value+1));
    printf(")");
    break;
  case tnull:
    printf("()");
    break;
  default:
    log_err("runtime/bltn_display: cannot print type [%d]\n", ob.tag);
  }
  return SDBOOL(0);
}

sdata bltn_print(sdata ob) {
  bltn_display(ob);
  return bltn_newline();
}
